package com.glls.stream;

import com.glls.lambda.pojo.Student;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * @date 2022/10/4
 * @desc Stream 流的中间操作
 *
 * 多个中间操作 可以连接起来 形成一个流水线  除非流水线上触发终止操作
 * 否则 中间操作不会进行任何处理  而是在终止操作时   一次性全部处理
 * 这个特性 称为  惰性求值
 *
 * 筛选 和切面操作
 */
public class StreamDemo2 {

    List<Student> list = Arrays.asList(
            new Student(1,"zs",18,88.0),
            new Student(2,"ls",19,88.5),
            new Student(3,"ww",21,98.0),
            new Student(4,"zl",19,86.0),
            new Student(5,"tq",17,92.0),
            new Student(5,"tq",17,92.0)
    );

    @Test
    public void test1(){
        // 研究 惰性求值   及  filter 中间操作
        Stream<Student> stream = list.stream().filter((s) -> {
            System.out.println("中间操作 惰性求值");
            return s.getScore() > 90;
        });

        stream.forEach(System.out::println);   // 有终止操作时  中间操作才会执行
    }


    @Test
    public void test2(){
        //distinct    根据流中元素 的   hashcode 和  equals 方法 判断元素是否重复
        list.stream().distinct().forEach(System.out::println);
    }

    @Test
    public void test3(){

        // 演示 短路操作
        list.stream().filter((s)->{
            System.out.println("中间操作");
            return s.getAge()<20;
        }).limit(2)
                .forEach(System.out::println);
    }

    @Test
    public void test4(){
        list.stream().skip(2).forEach(System.out::println);
    }
}
